Package installation and declaration (Chunk 1)

# vegan contains all the main nmds functions, as well as the data set used
if(!require(vegan)){install.packages("vegan")}
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.5/permute_0.9-8.zip'
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.5/vegan_2.7-2.zip'
package ‘permute’ successfully unpacked and MD5 sums checked
package ‘vegan’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\jedrake\AppData\Local\Temp\RtmpuuwHTe\downloaded_packages

Basic Example Visualization (Chunk 2)

NMDS on Basic Example (Chunk 3)

set.seed(1) #ensures reproducibility
vegdist(fourD) # uses bray-curtis distance by default, this is a step in metaMDS and doesn't need to be done here, but good for visualization

fakeNMDS <- metaMDS(comm = fourD, distance = "bray", trymax = 40)

ordiplot(fakeNMDS,type="n")
orditorp(fakeNMDS,display="species",col="red",air=1)
orditorp(fakeNMDS,display="sites",air=1)

Load and visualize data (Chunk 4)

# BCI is a data set in the vegan package that has data on tree counts from plots on Barro Colorado Island in Panama
data(BCI)
data(BCI.env)

# Combine and view environmental conditions data frame with species count data frame
head(BCI)
head(BCI.env)

# For viewing the entire dataframe
#View(BCI)
#View(BCI.env)

#Run NMDS (Chunk 5)

set.seed(67) # NMDS is iterative and random, so seed is set to ensure reproducible results (ensures the demo looks the same for everybody)
BCI_NMDS <- metaMDS(comm = BCI, distance = "bray", try = 40, trymax = 100) # the one command that does everything
print(BCI_NMDS)

Stressplot (Chunk 6)

stressplot(BCI_NMDS) # create stress plot visualization (as close as we come to checking conditions)

Basic Plotting options, works better for smaller data sets (Chunk 7)

# plots ordinations plainly, red dots are species representations of distance while grey dots are plots
# We can think of this as each species representing a vector (from the origin of the plot to the species dot) that pulls the plot dot towards it
plot(BCI_NMDS)

# basic plot option displaying most information possible, but ugly
ordiplot(BCI_NMDS,type="n") #Creates empty plot
orditorp(BCI_NMDS,display="species",col="red",air=1) #Writes in ordination vectors in red for "species." In this instance species is actually species (since this is the most common use of nmds), but in using for other situations, this could just be whatever the "dependent" variable is
orditorp(BCI_NMDS,display="sites",air=1) #plots points for each of the sites 

Clean Ordination Plots (Chunk 8)

# create array of habitat type for sorting plots 
hab <- as.array(BCI.env$Habitat)

#create array matching unique colors to each habitat type
colors = rep("",length(hab))
for (i in 1:length(hab))
{
  if (hab[i] == "OldHigh")
  {
    colors[i] <- "red"
  }
  else if (hab[i] == "OldSlope")
  {
    colors[i] <- "orange"
  }
  else if (hab[i] == "OldLow")
  {
    colors[i] <- "purple"
  }
  else if (hab[i] == "Young")
  {
    colors[i] <- "green"
  }
  else if (hab[i] == "Swamp")
  {
    colors[i] <- "blue"
  }
}

# create new plot scaled to necessary size for visibility, these numbers for xlim and ylim are guess and checked, plot must stay in correct aspect ratio to properly display distance
ordiplot(BCI_NMDS, type = "n", ylim = c(-.4, .4), xlim = c(-.8,.8)) |> 
  points("sites", col = colors, pch = 16) #plot points on this created plot for each site, with the designated color (pipe format)
ordihull(BCI_NMDS,groups=hab,draw="polygon",col=c("red","purple","orange")) # visually connect points with polygons

# Spider plot option
ordiplot(BCI_NMDS, type = "n", ylim = c(-.4, .4), xlim = c(-.8,.8))
ordispider(BCI_NMDS,groups=hab,col=c("red","purple","orange","blue","green"))

#NMDS Without Transformations (Chunk 9)

set.seed(67)
BCI_NMDS_noadjust <- metaMDS(comm = BCI, autotransform = FALSE, distance = "bray", try = 40, trymax = 100) #this line is the only one changed beyond an object name 
print(BCI_NMDS_noadjust)
stressplot(BCI_NMDS_noadjust)
ordiplot(BCI_NMDS_noadjust, type = "n", ylim = c(-.4, .4), xlim = c(-.8,.8)) |> 
  points("sites", col = colors, pch = 16) 
ordihull(BCI_NMDS_noadjust,groups=hab,draw="polygon",col=c("red","purple","orange")) 
ordiplot(BCI_NMDS_noadjust, type = "n", ylim = c(-.4, .4), xlim = c(-.8,.8))
ordispider(BCI_NMDS_noadjust,groups=hab,col=c("red","purple","orange","blue","green"))
LS0tDQp0aXRsZTogIk5NRFMgQ2xhc3MgRGVtbyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KIyBUaGlzIGlzIGFuIFIgTm90ZWJvb2ssIGl0IHdvcmtzIG11Y2ggdGhlIHNhbWUgYXMgYSBub3JtYWwgc2NyaXB0IGJ1dCBpdCBpcyBlYXNpZXIgdG8gc2VnbWVudCBzZWN0aW9ucyBvZiBjb2RlIHRvIGJlIHJ1biBhdCBhIHRpbWUuIENsaWNraW5nIHRoZSBydW4gYnV0dG9uIGF0IHRoZSB0b3Agb2YgZWFjaCAic2VjdGlvbiJjaHVuayIgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBoaWdobGlnaHRpbmcgdGhlIHNlbGVjdGVkIGNvZGUgYW5kIHJ1bm5pbmcganVzdCB0aGF0LCBidXQgdGhlIG91dHB1dCBpcyBkaXNwbGF5ZWQgdW5kZXIgdGhlIGNvZGUgaW4gdGhlIG5vdGVib29rIHJhdGhlciB0aGFuIGp1c3QgaW4gdGhlIGNvbnNvbGUgb3Igc2lkZSB2aWV3ZXIuDQotLS0NCiMgUGFja2FnZSBpbnN0YWxsYXRpb24gYW5kIGRlY2xhcmF0aW9uIChDaHVuayAxKQ0KYGBge3J9DQojIHZlZ2FuIGNvbnRhaW5zIGFsbCB0aGUgbWFpbiBubWRzIGZ1bmN0aW9ucywgYXMgd2VsbCBhcyB0aGUgZGF0YSBzZXQgdXNlZA0KaWYoIXJlcXVpcmUodmVnYW4pKXtpbnN0YWxsLnBhY2thZ2VzKCJ2ZWdhbiIpfQ0KbGlicmFyeSgidmVnYW4iKQ0KDQojIDNkIHBsb3R0aW5nIGNhcGFiaWxpdHkNCmlmKCFyZXF1aXJlKHBsb3RseSkpe2luc3RhbGwucGFja2FnZXMoInBsb3RseSIpfQ0KbGlicmFyeSgicGxvdGx5IikNCmBgYA0KIyBCYXNpYyBFeGFtcGxlIFZpc3VhbGl6YXRpb24gKENodW5rIDIpDQpgYGB7cn0NCiMgY3JlYXRpb24gb2YgZmFrZSBkYXRhIGZvciB2aXN1YWxpemF0aW9uDQptYXBsZSA8LSBjKDAsMTAsNywyLDgsMTkpDQphc2ggPC0gYygxLDIsMCwwLDEsMykNCmNoZXJyeSA8LSBjKDQsMCwwLDMsMCw3KQ0KYmlyY2ggPC0gYygwLDAsNiwzLDksMCkNCnRyZWVzMiA8LSBjKCJtYXBsZSIsICJhc2giKQ0KdHJlZXMzIDwtIGMoIm1hcGxlIiwgImFzaCIsImNoZXJyeSIpDQp0cmVlczQgPC0gYygibWFwbGUiLCAiYXNoIiwiY2hlcnJ5IiwgImJpcmNoIikNCg0KdHdvRCA8LSBkYXRhLmZyYW1lKE1hcGxlID0gbWFwbGUsIEFzaCA9IGFzaCkNCnRocmVlRCA8LSBkYXRhLmZyYW1lKE1hcGxlID0gbWFwbGUsIEFzaCA9IGFzaCwgQ2hlcnJ5ID0gY2hlcnJ5KQ0KZm91ckQgPC0gZGF0YS5mcmFtZShNYXBsZSA9IG1hcGxlLCBBc2ggPSBhc2gsIENoZXJyeSA9IGNoZXJyeSwgQmlyY2ggPSBiaXJjaCkNCg0KIyBQbG90IFZpc3VhbGl6YXRpb25zDQpWaWV3KHR3b0QpDQpwbG90KHR3b0QsIGNvbCA9ICJyZWQiKQ0KDQpWaWV3KHRocmVlRCkNCmZpZyA8LSBwbG90X2x5KHggPSB0aHJlZUQkTWFwbGUsIHkgPSB0aHJlZUQkQXNoLCB6ID0gdGhyZWVEJENoZXJyeSkNCmZpZyA8LSBmaWcgJT4lIGxheW91dChzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gIk1hcGxlIiksDQogICAgICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQXNoIiksDQogICAgICAgICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAiQ2hlcnJ5IikpKQ0KZmlnDQoNClZpZXcoZm91ckQpDQpwbG90KGZvdXJELCBjb2wgPSAicmVkIikNCmBgYA0KIyBOTURTIG9uIEJhc2ljIEV4YW1wbGUgKENodW5rIDMpDQpgYGB7cn0NCnNldC5zZWVkKDEpICNlbnN1cmVzIHJlcHJvZHVjaWJpbGl0eQ0KdmVnZGlzdChmb3VyRCkgIyB1c2VzIGJyYXktY3VydGlzIGRpc3RhbmNlIGJ5IGRlZmF1bHQsIHRoaXMgaXMgYSBzdGVwIGluIG1ldGFNRFMgYW5kIGRvZXNuJ3QgbmVlZCB0byBiZSBkb25lIGhlcmUsIGJ1dCBnb29kIGZvciB2aXN1YWxpemF0aW9uDQoNCmZha2VOTURTIDwtIG1ldGFNRFMoY29tbSA9IGZvdXJELCBkaXN0YW5jZSA9ICJicmF5IiwgdHJ5bWF4ID0gNDApDQoNCm9yZGlwbG90KGZha2VOTURTLHR5cGU9Im4iKQ0Kb3JkaXRvcnAoZmFrZU5NRFMsZGlzcGxheT0ic3BlY2llcyIsY29sPSJyZWQiLGFpcj0xKQ0Kb3JkaXRvcnAoZmFrZU5NRFMsZGlzcGxheT0ic2l0ZXMiLGFpcj0xKQ0KYGBgDQojIExvYWQgYW5kIHZpc3VhbGl6ZSBkYXRhIChDaHVuayA0KQ0KYGBge3J9DQojIEJDSSBpcyBhIGRhdGEgc2V0IGluIHRoZSB2ZWdhbiBwYWNrYWdlIHRoYXQgaGFzIGRhdGEgb24gdHJlZSBjb3VudHMgZnJvbSBwbG90cyBvbiBCYXJybyBDb2xvcmFkbyBJc2xhbmQgaW4gUGFuYW1hDQpkYXRhKEJDSSkNCmRhdGEoQkNJLmVudikNCg0KIyBDb21iaW5lIGFuZCB2aWV3IGVudmlyb25tZW50YWwgY29uZGl0aW9ucyBkYXRhIGZyYW1lIHdpdGggc3BlY2llcyBjb3VudCBkYXRhIGZyYW1lDQpoZWFkKEJDSSkNCmhlYWQoQkNJLmVudikNCg0KIyBGb3Igdmlld2luZyB0aGUgZW50aXJlIGRhdGFmcmFtZQ0KI1ZpZXcoQkNJKQ0KI1ZpZXcoQkNJLmVudikNCmBgYA0KI1J1biBOTURTIChDaHVuayA1KQ0KYGBge3J9DQpzZXQuc2VlZCg2NykgIyBOTURTIGlzIGl0ZXJhdGl2ZSBhbmQgcmFuZG9tLCBzbyBzZWVkIGlzIHNldCB0byBlbnN1cmUgcmVwcm9kdWNpYmxlIHJlc3VsdHMgKGVuc3VyZXMgdGhlIGRlbW8gbG9va3MgdGhlIHNhbWUgZm9yIGV2ZXJ5Ym9keSkNCkJDSV9OTURTIDwtIG1ldGFNRFMoY29tbSA9IEJDSSwgZGlzdGFuY2UgPSAiYnJheSIsIHRyeSA9IDQwLCB0cnltYXggPSAxMDApICMgdGhlIG9uZSBjb21tYW5kIHRoYXQgZG9lcyBldmVyeXRoaW5nDQpwcmludChCQ0lfTk1EUykNCmBgYA0KIyBTdHJlc3NwbG90IChDaHVuayA2KQ0KYGBge3J9DQpzdHJlc3NwbG90KEJDSV9OTURTKSAjIGNyZWF0ZSBzdHJlc3MgcGxvdCB2aXN1YWxpemF0aW9uIChhcyBjbG9zZSBhcyB3ZSBjb21lIHRvIGNoZWNraW5nIGNvbmRpdGlvbnMpDQpgYGANCiMgQmFzaWMgUGxvdHRpbmcgb3B0aW9ucywgd29ya3MgYmV0dGVyIGZvciBzbWFsbGVyIGRhdGEgc2V0cyAoQ2h1bmsgNykNCmBgYHtyfQ0KIyBwbG90cyBvcmRpbmF0aW9ucyBwbGFpbmx5LCByZWQgZG90cyBhcmUgc3BlY2llcyByZXByZXNlbnRhdGlvbnMgb2YgZGlzdGFuY2Ugd2hpbGUgZ3JleSBkb3RzIGFyZSBwbG90cw0KIyBXZSBjYW4gdGhpbmsgb2YgdGhpcyBhcyBlYWNoIHNwZWNpZXMgcmVwcmVzZW50aW5nIGEgdmVjdG9yIChmcm9tIHRoZSBvcmlnaW4gb2YgdGhlIHBsb3QgdG8gdGhlIHNwZWNpZXMgZG90KSB0aGF0IHB1bGxzIHRoZSBwbG90IGRvdCB0b3dhcmRzIGl0DQpwbG90KEJDSV9OTURTKQ0KDQojIGJhc2ljIHBsb3Qgb3B0aW9uIGRpc3BsYXlpbmcgbW9zdCBpbmZvcm1hdGlvbiBwb3NzaWJsZSwgYnV0IHVnbHkNCm9yZGlwbG90KEJDSV9OTURTLHR5cGU9Im4iKSAjQ3JlYXRlcyBlbXB0eSBwbG90DQpvcmRpdG9ycChCQ0lfTk1EUyxkaXNwbGF5PSJzcGVjaWVzIixjb2w9InJlZCIsYWlyPTEpICNXcml0ZXMgaW4gb3JkaW5hdGlvbiB2ZWN0b3JzIGluIHJlZCBmb3IgInNwZWNpZXMuIiBJbiB0aGlzIGluc3RhbmNlIHNwZWNpZXMgaXMgYWN0dWFsbHkgc3BlY2llcyAoc2luY2UgdGhpcyBpcyB0aGUgbW9zdCBjb21tb24gdXNlIG9mIG5tZHMpLCBidXQgaW4gdXNpbmcgZm9yIG90aGVyIHNpdHVhdGlvbnMsIHRoaXMgY291bGQganVzdCBiZSB3aGF0ZXZlciB0aGUgImRlcGVuZGVudCIgdmFyaWFibGUgaXMNCm9yZGl0b3JwKEJDSV9OTURTLGRpc3BsYXk9InNpdGVzIixhaXI9MSkgI3Bsb3RzIHBvaW50cyBmb3IgZWFjaCBvZiB0aGUgc2l0ZXMgDQpgYGANCiMgQ2xlYW4gT3JkaW5hdGlvbiBQbG90cyAoQ2h1bmsgOCkNCmBgYHtyfQ0KIyBjcmVhdGUgYXJyYXkgb2YgaGFiaXRhdCB0eXBlIGZvciBzb3J0aW5nIHBsb3RzIA0KaGFiIDwtIGFzLmFycmF5KEJDSS5lbnYkSGFiaXRhdCkNCg0KI2NyZWF0ZSBhcnJheSBtYXRjaGluZyB1bmlxdWUgY29sb3JzIHRvIGVhY2ggaGFiaXRhdCB0eXBlDQpjb2xvcnMgPSByZXAoIiIsbGVuZ3RoKGhhYikpDQpmb3IgKGkgaW4gMTpsZW5ndGgoaGFiKSkNCnsNCiAgaWYgKGhhYltpXSA9PSAiT2xkSGlnaCIpDQogIHsNCiAgICBjb2xvcnNbaV0gPC0gInJlZCINCiAgfQ0KICBlbHNlIGlmIChoYWJbaV0gPT0gIk9sZFNsb3BlIikNCiAgew0KICAgIGNvbG9yc1tpXSA8LSAib3JhbmdlIg0KICB9DQogIGVsc2UgaWYgKGhhYltpXSA9PSAiT2xkTG93IikNCiAgew0KICAgIGNvbG9yc1tpXSA8LSAicHVycGxlIg0KICB9DQogIGVsc2UgaWYgKGhhYltpXSA9PSAiWW91bmciKQ0KICB7DQogICAgY29sb3JzW2ldIDwtICJncmVlbiINCiAgfQ0KICBlbHNlIGlmIChoYWJbaV0gPT0gIlN3YW1wIikNCiAgew0KICAgIGNvbG9yc1tpXSA8LSAiYmx1ZSINCiAgfQ0KfQ0KDQojIGNyZWF0ZSBuZXcgcGxvdCBzY2FsZWQgdG8gbmVjZXNzYXJ5IHNpemUgZm9yIHZpc2liaWxpdHksIHRoZXNlIG51bWJlcnMgZm9yIHhsaW0gYW5kIHlsaW0gYXJlIGd1ZXNzIGFuZCBjaGVja2VkLCBwbG90IG11c3Qgc3RheSBpbiBjb3JyZWN0IGFzcGVjdCByYXRpbyB0byBwcm9wZXJseSBkaXNwbGF5IGRpc3RhbmNlDQpvcmRpcGxvdChCQ0lfTk1EUywgdHlwZSA9ICJuIiwgeWxpbSA9IGMoLS40LCAuNCksIHhsaW0gPSBjKC0uOCwuOCkpIHw+IA0KICBwb2ludHMoInNpdGVzIiwgY29sID0gY29sb3JzLCBwY2ggPSAxNikgI3Bsb3QgcG9pbnRzIG9uIHRoaXMgY3JlYXRlZCBwbG90IGZvciBlYWNoIHNpdGUsIHdpdGggdGhlIGRlc2lnbmF0ZWQgY29sb3IgKHBpcGUgZm9ybWF0KQ0Kb3JkaWh1bGwoQkNJX05NRFMsZ3JvdXBzPWhhYixkcmF3PSJwb2x5Z29uIixjb2w9YygicmVkIiwicHVycGxlIiwib3JhbmdlIikpICMgdmlzdWFsbHkgY29ubmVjdCBwb2ludHMgd2l0aCBwb2x5Z29ucw0KDQojIFNwaWRlciBwbG90IG9wdGlvbg0Kb3JkaXBsb3QoQkNJX05NRFMsIHR5cGUgPSAibiIsIHlsaW0gPSBjKC0uNCwgLjQpLCB4bGltID0gYygtLjgsLjgpKQ0Kb3JkaXNwaWRlcihCQ0lfTk1EUyxncm91cHM9aGFiLGNvbD1jKCJyZWQiLCJwdXJwbGUiLCJvcmFuZ2UiLCJibHVlIiwiZ3JlZW4iKSkNCmBgYA0KI05NRFMgV2l0aG91dCBUcmFuc2Zvcm1hdGlvbnMgKENodW5rIDkpDQpgYGB7cn0NCnNldC5zZWVkKDY3KQ0KQkNJX05NRFNfbm9hZGp1c3QgPC0gbWV0YU1EUyhjb21tID0gQkNJLCBhdXRvdHJhbnNmb3JtID0gRkFMU0UsIGRpc3RhbmNlID0gImJyYXkiLCB0cnkgPSA0MCwgdHJ5bWF4ID0gMTAwKSAjdGhpcyBsaW5lIGlzIHRoZSBvbmx5IG9uZSBjaGFuZ2VkIGJleW9uZCBhbiBvYmplY3QgbmFtZSANCnByaW50KEJDSV9OTURTX25vYWRqdXN0KQ0Kc3RyZXNzcGxvdChCQ0lfTk1EU19ub2FkanVzdCkNCm9yZGlwbG90KEJDSV9OTURTX25vYWRqdXN0LCB0eXBlID0gIm4iLCB5bGltID0gYygtLjQsIC40KSwgeGxpbSA9IGMoLS44LC44KSkgfD4gDQogIHBvaW50cygic2l0ZXMiLCBjb2wgPSBjb2xvcnMsIHBjaCA9IDE2KSANCm9yZGlodWxsKEJDSV9OTURTX25vYWRqdXN0LGdyb3Vwcz1oYWIsZHJhdz0icG9seWdvbiIsY29sPWMoInJlZCIsInB1cnBsZSIsIm9yYW5nZSIpKSANCm9yZGlwbG90KEJDSV9OTURTX25vYWRqdXN0LCB0eXBlID0gIm4iLCB5bGltID0gYygtLjQsIC40KSwgeGxpbSA9IGMoLS44LC44KSkNCm9yZGlzcGlkZXIoQkNJX05NRFNfbm9hZGp1c3QsZ3JvdXBzPWhhYixjb2w9YygicmVkIiwicHVycGxlIiwib3JhbmdlIiwiYmx1ZSIsImdyZWVuIikpDQpgYGANCg0KDQoNCg==